package com.candy.dao;

import java.sql.*;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Set;

/**
 * 因为资源不能一直持有，所有在执行后，需要将connection、statement、resultSet关闭掉
 * 当resultSet关闭后，不能不能够继续获取resultSet中的内容
 * 为解决这样的问题，
 * 需要再连接关闭前对数据进行转储
 * 常用的数据转储方式共有两种
 * 1、使用List+Map的方式进行转储
 * 2、使用List+javaBean的方式进行转储
 */
public class DBHelper2 {
    public static void main(String[] args) {
        try {
//        （0）下载jdbc驱动包；将驱动包导入项目。
//        注意：mysql8和mysql5的驱动包版本不通用。
//        本次项目使用maven进行构建，直接在pom中添加依赖即可
//        （1）注册或实例化jdbc的驱动类
//            反射的方式进行创建，需要进行异常处理（ctrl+alt+t）
            Class.forName("com.mysql.cj.jdbc.Driver");
//        （2）获取数据库连接对象Connection
//            获取链接对象，需要准备三个参数
//            a、数据库的连接串（mysql8月mysql5的连接串不同）
//            jdbc:mysql 指的是jdbc链接mysql数据库
//            localhost指的是要链接的数据库的ip地址（此处的localhost表示本机）
//            3306表示mysql的默认端口
//            database_name要链接的数据库的库名（需要更换成你想要的数据库名字）
            String url="jdbc:mysql://localhost:3306/ld_mysql0317? characterEncoding=utf8 & useSSL=false & serverTimezone=UTC & rewriteBatchedStatements=true";
//            b、数据库的用户名
            String username="root";
//            c、数据库的密码
            String password="123456";
            Connection conn=DriverManager.getConnection(url,username,password);
//        （3）获取数据库操作对象Statement（执行增删改查）
            Statement ment=conn.createStatement();
//        （4）执行SQL语句，获取数据操作结果或者结果集对象ResultSet
            String sql="SELECT * FROM userinfo";
            ResultSet re=ment.executeQuery(sql);
//        （5）解析结果集对象ResultSet，进行相关的业务处理；
//            对数据进行转储
//           准备一个List进行数据的存储，将每一行的数据放在一个map中
            LinkedList<HashMap<String,Object>> datalist=new LinkedList<>();
//            准备要将数据每一行存放的map集合
            HashMap eachrow=null;
//            获取元数据
            ResultSetMetaData rm=re.getMetaData();
//            获取该数据表共有多少列
            int count=rm.getColumnCount();
//           next用于数据读取，若当前行没有数据返回false，反之返回true
            while(re.next()){
//                对装每一行数据的map进行实例化
                eachrow=new HashMap();
//                将每一行的数据写入eachrow中
//                使用for循环进行遍历， 数据表中有几列就会遍历几次
                for (int i = 1; i <=count ; i++) {
//                  rm.getColumnLabel(i)取出对应列的列名
//                  re.getObject(rm.getColumnLabel(i))通过列名取出对应的值
                    eachrow.put(rm.getColumnLabel(i),re.getObject(rm.getColumnLabel(i)));
                }
//               将每一行的数据添加到list集合中
                datalist.add(eachrow);
            }
//            关闭资源
            re.close();
            ment.close();
            conn.close();
//            当连接关闭后，获取list集合中的数据
//            对list集合进行遍历操作
            for(HashMap<String,Object> row:datalist){
//                取出map中的所有key值
                Set se=row.keySet();
//                遍历set集合
                for (Object ob:se){
//                    打印所有的key以及value
//                    row.get(ob)通过key值取出对应的value
                    System.out.print("key:"+ob+",value:"+row.get(ob)+"\t");
                }
//                一行执行结束后，在换行处理
                System.out.println();
            }
//
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
}
